/*  
 * Copyright (c) 2025 kkaheng
 * SPDX-License-Identifier: MIT  
 */
 
package com.kkaheng.grid.view.cell;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.text.TextPaint;
import android.text.TextUtils;
import android.view.Gravity;

/**
 * 文本单元格（强制单行）。
 * 职责：
 * 1. 在 {@link #onDraw} 中完成单行文本绘制；
 * 2. 在 {@link #measureWidth}/{@link #measureHeight} 中返回像素尺寸（已包含 padding）；
 * 3. 支持文字颜色、大小、字体、对齐方式等常用属性。
 *
 * 注意：该类已移除多行逻辑，所有文本统一按单行处理。
 */
public final class TextCell extends Cell<String> {

    /* ---------- 文本相关属性 ---------- */

    // 字体画笔（复用对象，避免 onDraw 中重复创建）
    private final TextPaint mTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);

    // 颜色、大小、对齐、字体
    private int mTextColor = Color.BLACK;
    private float mTextSize = 14f;               // sp 或 dp 由调用者保证
    private int mGravity = Gravity.START | Gravity.TOP;
    private Typeface mTypeface;

    /* ---------- 构造 ---------- */

    public TextCell() {
        mTextPaint.setColor(mTextColor);
        mTextPaint.setTextSize(mTextSize);
    }

    /* ---------- 内容绘制（核心） ---------- */

    /**
     * 绘制文本（强制单行）。
     *
     * @param text          要绘制的字符串（已判空）
     * @param canvas        画布（已平移到内容区域左上角，已 clip）
     * @param column        列索引（预留，可忽略）
     * @param row           行索引（预留，可忽略）
     * @param contentWidth  内容区域宽度（已减去 padding）
     * @param contentHeight 内容区域高度（已减去 padding）
     * @param scaleFactor   缩放因子
     */
    @Override
    protected void onDraw(String text,
                          Canvas canvas,
                          int column,
                          int row,
                          float contentWidth,
                          float contentHeight,
                          float scaleFactor) {

        // 1. 更新画笔（仅更新会变动的属性）
        mTextPaint.setColor(mTextColor);
        mTextPaint.setTextSize(mTextSize * scaleFactor);
        if (mTypeface != null) {
            mTextPaint.setTypeface(mTypeface);
        }

        // 2. 计算 baseline 位置
        Paint.FontMetrics fm = mTextPaint.getFontMetrics();
        float textHeight = fm.bottom - fm.top;

        // 垂直方向偏移
        float drawY;
        final int vGravity = mGravity & Gravity.VERTICAL_GRAVITY_MASK;
        if (vGravity == Gravity.CENTER_VERTICAL) {
            drawY = (contentHeight * scaleFactor - textHeight) / 2f - fm.top;
        } else if (vGravity == Gravity.BOTTOM) {
            drawY = contentHeight * scaleFactor - fm.bottom;
        } else { // 默认 TOP
            drawY = -fm.top;
        }

        // 水平方向偏移
        float drawX;
        final int hGravity = mGravity & Gravity.HORIZONTAL_GRAVITY_MASK;
        float textWidth = mTextPaint.measureText(text);
        if (hGravity == Gravity.CENTER_HORIZONTAL) {
            drawX = (contentWidth * scaleFactor - textWidth) / 2f;
        } else if (hGravity == Gravity.END || hGravity == Gravity.RIGHT) {
            drawX = contentWidth * scaleFactor - textWidth;
        } else { // 默认 START / LEFT
            drawX = 0f;
        }

        // 3. 绘制
        canvas.drawText(text, drawX, drawY, mTextPaint);
    }

    /* ---------- 测量（外部调用时包含 padding） ---------- */

    /**
     * 测量文本宽度（含 padding）。
     * @param text 待测字符串
     * @return 宽度(px)
     */
    @Override
    public float measureWidth(String text) {
        if (TextUtils.isEmpty(text)) return getPaddingHorizontally();
        mTextPaint.setTextSize(mTextSize);
        return mTextPaint.measureText(text) + getPaddingHorizontally();
    }

    /**
     * 测量文本高度（含 padding）。
     * 单行场景直接返回字体高度 + padding。
     * @param text 待测字符串
     * @return 高度(px)
     */
    @Override
    public float measureHeight(String text) {
        mTextPaint.setTextSize(mTextSize);
        Paint.FontMetrics fm = mTextPaint.getFontMetrics();
        float textHeight = fm.bottom - fm.top;
        return textHeight + getPaddingVertically();
    }

    public void setTextColor(int color) {
        mTextColor = color;
    }

    public void setTextSize(float size) {
        mTextSize = size;
    }

    public void setGravity(int gravity) {
        mGravity = gravity;
    }

    public void setTypeface(Typeface typeface) {
        mTypeface = typeface;
    }

    public float getTextSize() {
    	return mTextSize;
    }

    public int getTextColor() {
    	return mTextColor;
    }

    public Typeface getTypeface() {
    	return mTypeface;
    }

    public int getGravity() {
    	return mGravity;
    }

    public TextPaint getTextPaint() {
    	return mTextPaint;
    }

}
